/**
 * Appende un DOM document all'elemento con l'id specificato
 * @param {Object} newDocument DOM document da appendere
 * @param {Object} idLocation ID dell'elemento di destinazione
 */
function putDocument(newDocument,idLocation)
{
	if (newDocument.documentElement) document.getElementById(idLocation).appendChild(document.importNode(newDocument.documentElement, true));
	else document.getElementById(idLocation).appendChild(document.importNode(newDocument, true));
}


/**
 * Crea un nuovo div, lo appende al body e vi carica dentro un DOM document
 * @param {Object} domToAppend DOM document da inserire
 * @param {Object} newID ID del div che si appresta a creare
 * @param {Object} visible True se si vuole che il div sia visibile, false altrimenti
 */
function putOnScreen(domToAppend, newID, visible)
{
	if (!document.getElementById('messaggi-debug')){
			var newDiv = document.createElement('div');
			newDiv.setAttribute('id','messaggi-debug');
			document.documentElement.getElementsByTagName('body')[0].appendChild(newDiv);
	}
	var newDiv = document.createElement('div');
	newDiv.setAttribute('id',newID);
	if(!visible) newDiv.style.visibility  = "hidden";
	if(!visible) newDiv.style.display = "none";
	document.getElementById('messaggi-debug').appendChild(newDiv);
	putDocument(domToAppend,newID);
}

/**
 * Crea un paragrafo nella destinazione indicata contenente il testo indicato
 * @param {Object} text Testo del paragrafo
 * @param {Object} idLocation Locazione in cui inserire il paragrafo
 */
function putText(text, idLocation)
{
	var newP = document.createElement('p');
	var newText = document.createTextNode(text);
	newP.appendChild(newText);
	document.getElementById(idLocation).appendChild(newP);
}

function putDebText(text)
{
	if (!document.getElementById('messaggi-debug')){
		var newDiv = document.createElement('div');
		newDiv.setAttribute('id','messaggi-debug');
		document.documentElement.getElementsByTagName('body')[0].appendChild(newDiv);
	}
	var newP = document.createElement('p');
	var newText = document.createTextNode(text);
	newP.appendChild(newText);
	document.getElementById('messaggi-debug').appendChild(newP);
}

/**
 * Effettua una trasformazione xslt asincrona
 * @param {Object} xmlDOM XML vittima
 * @param {Object} xslDOM XSL esecutore
 * @param {Object} destDOM Null se si vuole creare un nuovo documento, oppure il
 * documento di destinazione
 * @param {Object} callback Funzione da richiamare alla terminazione della trasformazione.
 * Ha la forma di 'callback(transformedXML)'
 */
function asyncXslTransform (xmlDOM, xslDOM, destDOM, callback) {
	var output;

	if (window.XSLTProcessor) {
		var xp =new XSLTProcessor();
		xp.importStylesheet(xslDOM);
		
		if (destDOM == undefined || destDOM == null)
			output = xp.transformToDocument(xmlDOM);
		else
			output = xp.transformToFragment (xmlDOM, destDOM);
	} else if (window.ActiveXObject) {
		xslp = xslt.createProcessor();
      	xslp.input = xmlDOM;
      	xslp.transform();
      	output=xslp.output;
	} else {
		assert (false, "xslTransform: non c'e' trippa per gatti");
	}

	callback(output);
}
